package org.jetlinks.demo.protocol.siterwell.tcp;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.jetlinks.core.utils.BytesUtils;

import java.util.Arrays;

/**
 * 赛特威尔网关 tcp 报文协议格式
 * <p>
 *
 第1字节   57		固定头（心跳数据除外）
 第2字节   01		流水号（回复时，此流水号需要一致）
 第3字节   20		版本号
 第4-6字节 339053		网关ID
 第7字节   16		网关GSM信号
 第8字节   16		子设备RF信号
 第9字节   01		子设备类型
 第10字节  3F		子设备最高2位ID
 第11字节  0A		网关类型(固定为0A)
 第12字节  21		命令 ， 写取传感器
 第13字节  00		数据长度
    中间字节是数据
 最后1个字节 27		校验值


    <p>心跳数据
  第1个字节 4d       固定值（字母 M ）
  第2-4字节 339053     网关ID

 */
@Getter
@Setter
@AllArgsConstructor(staticName = "of")
public class SiterWellTcpMessage {

    private MessageType type;

    private TcpPayload data;

    public static SiterWellTcpMessage of(byte[] payload) {
        MessageType type = MessageType.of(payload).orElseThrow(IllegalArgumentException::new);
        return SiterWellTcpMessage.of(type, type.read(payload, 5));
    }

    public ByteBuf toByteBuf(){
        return Unpooled.wrappedBuffer(toBytes());
    }

    public byte[] toBytes() {
        byte[] header = new byte[5];
        header[0] = (byte) type.ordinal();

        byte[] body = type.toBytes(data);
        int bodyLength = body.length;

        BytesUtils.intToLe(header, bodyLength, 1);

        if (bodyLength == 0) {
            return header;
        }
        byte[] data = Arrays.copyOf(header, bodyLength + 5);
        System.arraycopy(body, 0, data, 5, bodyLength);

        return data;
    }

    @Override
    public String toString() {
        return "TcpMessage{" +
                "type=" + type +
                ", data=" + data +
                '}';
    }
}
